1   /*
2    * Copyright (C) 2011 The Guava Authors
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package com.google.common.reflect;
18  
19  import static com.google.common.base.Preconditions.checkArgument;
20  
21  import com.google.common.annotations.Beta;
22  
23  import java.lang.reflect.Type;
24  import java.lang.reflect.TypeVariable;
25  
26  import javax.annotation.Nullable;
27  
28  /**
29   * Captures a free type variable that can be used in {@link TypeToken#where}.
30   * For example:
31   *
32   * <pre>   {@code
33   *   static <T> TypeToken<List<T>> listOf(Class<T> elementType) {
34   *     return new TypeToken<List<T>>() {}
35   *         .where(new TypeParameter<T>() {}, elementType);
36   *   }}</pre>
37   *
38   * @author Ben Yu
39   * @since 12.0
40   */
41  @Beta
42  public abstract class TypeParameter<T> extends TypeCapture<T> {
43  
44    final TypeVariable<?> typeVariable;
45  
46    protected TypeParameter() {
47      Type type = capture();
48      checkArgument(type instanceof TypeVariable, "%s should be a type variable.", type);
49      this.typeVariable = (TypeVariable<?>) type;
50    }
51  
52    @Override public final int hashCode() {
53      return typeVariable.hashCode();
54    }
55  
56    @Override public final boolean equals(@Nullable Object o) {
57      if (o instanceof TypeParameter) {
58        TypeParameter<?> that = (TypeParameter<?>) o;
59        return typeVariable.equals(that.typeVariable);
60      }
61      return false;
62    }
63  
64    @Override public String toString() {
65      return typeVariable.toString();
66    }
67  }